#include <jni.h>
#include <string>
#include "EnjoyPlayer.h"

JavaVM *javaVM = 0;

//jni.h中定义的一个方法,当jni加载的时候会自动调用
JNIEXPORT jint JNICALL JNI_OnLoad(JavaVM *vm, void *reserved) {
    javaVM = vm;
    return JNI_VERSION_1_4;
}


extern "C"
JNIEXPORT void JNICALL
Java_com_endoc_enjoyplayer_EnjoyPlayer_nativePlay(JNIEnv *env, jobject thiz, jstring path) {
    // TODO: implement nativePlay()
}

extern "C"
JNIEXPORT void JNICALL
Java_com_endoc_enjoyplayer_EnjoyPlayer_nativePause(JNIEnv *env, jobject thiz) {
    // TODO: implement nativePause()
}

extern "C"
JNIEXPORT void JNICALL
Java_com_endoc_enjoyplayer_EnjoyPlayer_setDataSource(JNIEnv *env, jobject thiz, jlong native_handle,
                                                     jstring path) {
  //获取java层传递过来的路径 0表示不用copy
    const char*  nativePath  = env->GetStringUTFChars(path,0);
    if(nativePath== nullptr){
        return;
    }

    //又把c层创建的EnjoyPlayer对象,从java层传给c层
    EnjoyPlayer *enjoyPlayer = reinterpret_cast<EnjoyPlayer *>(native_handle);

    //把path路径存起来
    enjoyPlayer->setDataSource(nativePath);

   /*
    * 在调用GetStringUTFChars函数从JVM内部获取一个字符串之后，JVM内部会分配一块新的内存，用于存储源字符串
    的拷贝，以便本地代码访问和修改。即然有内存分配，用完之后马上释放是一个编程的好习惯。通过调用
    ReleaseStringUTFChars函数通知JVM这块内存已经不使用了，你可以清除了。注意：这两个函数是配对使用的，用
    了GetXXX就必须调用ReleaseXXX，而且这两个函数的命名也有规律，除了前面的Get和Release之外，后面的都一
     样
     */
    //释放内存
    env->ReleaseStringUTFChars(path,nativePath);
}

extern "C"
JNIEXPORT jlong JNICALL
Java_com_endoc_enjoyplayer_EnjoyPlayer_init(JNIEnv *env, jobject thiz) {
    EnjoyPlayer *enjoyPlayer =new EnjoyPlayer(new JavaCallHelp(javaVM,env,thiz));//new出来分配在堆中,不会随着函数运行完就释放,所以C层的对象给java层是通过指针传递的,那么就是long类型.对标地址
    return reinterpret_cast<jlong>(enjoyPlayer);//此处返回是指针类型
}

